from apps.contents.models import GoodsChannel


def get_categories():
    """获取商品分类"""
    # 准备商品分类数据的大字典
    categories = {}
    # 查询所有的商品频道数据,并且按照组号和组内序号排序,默认从小到大,升序
    # all可以省略
    # channels = GoodsChannel.objects.all().order_by("group_id","sequence")
    channels = GoodsChannel.objects.order_by("group_id", "sequence")
    # 遍历所有的商品频道数据,取出对应的group_id
    for channel in channels:
        # 取出频道对应的group_id 作为categories的key 多查一,使用多方模型对象.外键属性名
        group_id = channel.group_id
        # 如果group在categories以存在,就不需要重复分组了.
        if group_id not in categories:
            categories[group_id] = {"channels": [], "sub_cats": []}

        # 构造频道数据
        # 　通过频道找到他所对应的一级分类
        cat1 = channel.category
        categories[group_id]["channels"].append({
            "id": channel.id,  # 频道的id
            "name": cat1.name,  # 频道的名称:频道对应的一级分类的名称
            "url": channel.url,  # 频道广告链接
        })

        # 构造２级和３级分类数据
        # 通过cat1 找到对应的cat2,便利cat2找到频道(一级分类)所对应的全部二级分类(cat1查cat2一查多
        for cat2 in cat1.subs.all():
            # 通过cat2查询cat3,遍历所有的cat3,构造出字典列表
            sub_cats = []
            for cat3 in cat2.subs.all():
                sub_cats.append({
                    "id": cat3.id,  # 三级 分类id
                    "name": cat3.name,  # 三级 分类名称
                })

            categories[group_id]["sub_cats"].append({
                "id": cat2.id,  # 二级id
                "name": cat2.name,  # 二级分类名称
                "sub_cats": sub_cats,  # 二级对应的三级列表

            })
    return categories